
package com.joysuch.wwyt.core.common.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;

/**
 * 分页数据转换的工具类.主要应用于将从数据库中查询出的数据转换为接口格式的数据
 *
 * @author zhangxiaohuan
 * @company huanke
 * @date 2019年11月24日 下午10:59:11
 * @since
 */
public class PageDataUtils {

    public static Pageable addOrderByDesc(Pageable pageable, String property) {
        return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(Order.desc(property)));
    }

    public static Pageable addOrderByAsc(Pageable pageable, String property) {
        return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(Order.asc(property)));
    }

    public static Pageable addOrderSort(Pageable pageable, String sort, String... property) {
        if (sort.equals("ASC")) {
            return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.Direction.ASC, property);
        } else {
            return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.Direction.DESC, property);
        }
    }

    /**
     * 转换分页数据类型
     *
     * @param <T>       目标数据类型
     * @param <F>       源数据类型
     * @param pageData  分页数据
     * @param convertor 转换器
     * @return 分页数据
     */
    public static <T, F> Page<T> convertPageData(Page<F> pageData, PageDataConvert<T, F> convertor) {
        if (pageData == null || pageData.getContent() == null || pageData.getContent().isEmpty()) {
            return new PageImpl<T>(Collections.EMPTY_LIST, pageData.getPageable(), pageData.getTotalElements());
        }
        List<T> list = new ArrayList<>(pageData.getContent().size());
        for (F rp : pageData) {
            list.add(convertor.convert(rp));
        }
        return new PageImpl<T>(list, pageData.getPageable(), pageData.getTotalElements());
    }

    /**
     * 转换列表数据类型
     *
     * @param <T>       目标数据类型
     * @param <F>       源数据类型
     * @param listData  待转换列表数据
     * @param convertor 转换器
     * @return 列表数据
     */
    public static <T, F> List<T> convertListData(List<F> listData, PageDataConvert<T, F> convertor) {
        if (listData == null || listData.isEmpty()) {
            return Collections.EMPTY_LIST;
        }
        List<T> list = new ArrayList<>(listData.size());
        for (F rp : listData) {
            list.add(convertor.convert(rp));
        }
        return list;
    }

    public static interface PageDataConvert<T, F> {

        T convert(F f);

    }
}
